package cn.kgc.lambda;

/**
 * @author: mosin
 * @version: v1.0  2022/10/20
 * 什么是lambda
 *  java8 新特性  本质匿名函数
 * 有什么作用
 * 1.简化代码的编写 让代码的编写更加的紧凑  函数式编程
 * 2.简化使用匿名内部类创建对象的过程
 *
 *
 * 基本语法：
 *   ()->{ }           js  箭头函数  ()=>{ }
 *   () : 参数列表
 *    ->  连接符
 *   { }  方法体
 *
 *
 * 不足：
 *      代码可读性降低
 *
 * 方法的引用   ::
 */
public class LambdaDemo {

    public static void main(String[] args) {

        // 通过实现类 创建 LambdaInterface 类型的实例化对象
        LambdaInterface lambdaInterface =  new LambdaClass();
        lambdaInterface.method1();

        //通过匿名内部类的方式创建 LambdaInterface 类型对象

        LambdaInterface  lambdaInterface1 = new LambdaInterface() {
            @Override
            public void method1() {
                System.out.println("通过匿名内部类创建的对象");
            }
        };

        lambdaInterface1.method1();

        System.out.println("-------------没有返回值，没有参数----------------");
        // 通过lambda表达式创建接口的实例对象  要求： 接口中只能有一个抽象的方法
        // 简化lambda写法时 如果参数列表中没有参数  小括号是不能省略的
        LambdaInterface  lambdaInterface2 = ()->System.out.println("通过lambda表达式创建的对象");

        lambdaInterface2.method1();


        System.out.println("-------------没有返回值，含有一个参数----------------");

        //过lambda表达式创建接口的实例对象 重写的方法 含有参数 没有返回值
        //LambdaInterface2 lambdaInterface21 = (int a)->{
        //    System.out.println("a = " + a);
        //};

        // 重写方法时 可以省略参数的类型
        //LambdaInterface2 lambdaInterface21 = (a)->{
        //    System.out.println("a = " + a);
        //};

        // 参数列表中只有一个参数 可以省略小括号
        //LambdaInterface2 lambdaInterface21 = a ->{
        //    System.out.println("a = " + a);
        //};

        // 如果重写的方法中只有一条语句  大括号可以省略
        LambdaInterface2 lambdaInterface21 = a -> System.out.println("a = " + a);

        //调用方法
        lambdaInterface21.method(10);


        System.out.println("-------------没有返回值,含有多个参数----------------");
        // 含有多个参数时 小括号不能省略
        LambdaInterface3 lambdaInterface3 = (a,b)->{
            System.out.println("a = " + a);
            System.out.println("b = " + b);
        };

        lambdaInterface3.method(10, 20);


        System.out.println("-------------有返回值,没有参数----------------");

        //LambdaInterface4  lambdaInterface4 = ()->{
        //    return 20;
        //};

        // 如果有返回值并且方法体中只有一条语句  大括号可以省略 return关键词也可以省略
        LambdaInterface4  lambdaInterface4 = ()-> 20;

        int num = lambdaInterface4.method();
        System.out.println("num = " + num);

        System.out.println("-------------有返回值,有一个参数----------------");

        //LambdaInterface5 lambdaInterface5 = (a)->{
        //    return a;
        //};

        //LambdaInterface5 lambdaInterface5 = a->{
        //    System.out.println("a = " + a);
        //    return a;
        //};


        LambdaInterface5 lambdaInterface5 = a -> a;

        int num2 = lambdaInterface5.method(20);
        System.out.println("num2 = " + num2);


        System.out.println("-------------有返回值,有多个参数----------------");

        //LambdaInterface6 lambdaInterface6 = (a,b)-> {
        //    System.out.println("a +b = " + (a+b));
        //    return a+b;
        //};

        LambdaInterface6 lambdaInterface6 = (a,b)-> a+b;
        int num3 = lambdaInterface6.method(1, 2);
        System.out.println("num3 = " + num3);
    }

}
